const fs = require('fs');
const path = require('path');
const pathURL = require('../utils/path');

//接受父进程传下来的信息
process.on('message', (command) => {
    const arr = command.split(' '); //arr[0] = showDir
    //判断数组长度，判断有没有输入文件夹名称
    if (arr.length >= 2) {
        //判断查询的需要查看的文件夹是否存在
        if (!fs.existsSync(path.resolve(pathURL(`${arr[1]}`)))) {
            process.send('请输入正确的文件夹名');
            return; //不会再执行return下面的操作
        }
        if (arr.length === 2) { //根据数组长度判断没有特殊指令
            fs.readdir(path.resolve(pathURL(`${arr[1]}`)), (err, file) => {
                if (err) { //报错就会直接输出错误，随后将信息送回给父进程
                    console.log(err);
                    process.send('读取文件信息错误');
                } else { //如果路径正确就会进入这一步
                    const array = []; //设置一个专门用于装文件信息的数组
                    file.forEach((element) => { //让文件夹中的文件进行forEach()循环
                            //使用elementInfo来接收文件信息
                            const elementInfo = new FileInfo(pathURL(`${arr[1]}/${element}`));
                            //将得到的文件信息挨个推入数组中
                            array.push(elementInfo);
                        })
                        //循环输出该文件夹中的文件信息
                        //没有选择排序方式直接默认排序
                        //以表格形式打出
                    console.table(array);
                    process.send('以上是文件信息');
                }
            })
        } else if (arr.length === 3) { //根据指令的数组长度，判断使用了哪种排序方式
            if (arr[2] === '-s') {
                fs.readdir(path.resolve(pathURL(`${arr[1]}`)), (err, file) => {
                    const array = [];
                    file.forEach((element) => {
                        const elementInfo = new FileInfo(pathURL(`${arr[1]}/${element}`));
                        array.push(elementInfo);
                    })
                    array.sort(function(a, b) {
                        //文件夹没有直接表示的文件大小，于是在比较是将大小默认为-1，目的是将文件夹放到最后
                        if (a.fileType === 'dir') {
                            a.fileSize = -1;
                        }
                        if (b.fileType === 'dir') {
                            b.fileSize = -1;
                        }
                        //比较大小，降序输出
                        return parseInt(b.fileSize) - parseInt(a.fileSize);
                    });
                    //判断完成后，将文件夹的大小改回原来的空字符串
                    array.forEach((element) => {
                        if (element.fileType === 'dir') {
                            element.fileSize = '';
                        }
                    })
                    console.table(array);
                    process.send('以上是文件信息');
                })
            } else if (arr[2] === '-u') { //根据更新时间排序
                fs.readdir(path.resolve(pathURL(`${arr[1]}`)), (err, file) => {
                    const array = [];
                    file.forEach((element) => {
                        const elementInfo = new FileInfo(pathURL(`${arr[1]}/${element}`));
                        array.push(elementInfo);
                    })
                    array.sort(function(a, b) {
                        //将数组中对象的更新时间属性（字符串）拿出来，转换成时间戳进行比较
                        return new Date(b.fileUpdateTime) - new Date(a.fileUpdateTime);
                    });
                    console.table(array);
                    process.send('以上是文件信息');
                })
            } else {
                process.send('请输入正确的指令! 举例: showDir ./ -s');
            }
        }
    } else {
        process.send('请输入正确的指令！举例: showDir ./');
    }
})

//获取文件的更新时间
function upDateTime(filePath) {
    //使用了fs.statSync(filePath).mtimeMs方法获取文件的更新时间
    //随后用new Date().toLocaleString()方法将获取的字符串转换成当地时间
    const fileUpdateTime = new Date(fs.statSync(filePath).mtimeMs).toLocaleString();
    return fileUpdateTime;
}

//获取文件的大小
function Size(filePath) {
    //使用了 fs.statSync(filePath).isDirectory()方法判断文件是否是文件夹
    if (fs.statSync(filePath).isDirectory()) {
        //如果是文件夹，将文件夹大小定义为空
        return this.fileSize = '';
    } else {
        //如果不是文件夹，就返回正常的文件大小
        return this.fileSize = fs.statSync(filePath).size + 'byte';
    }

}

//获取文件类型
function Type(filePath) {
    //使用了 fs.statSync(filePath).isDirectory()来判断是否是文件夹
    if (fs.statSync(filePath).isDirectory()) {
        //如果是，就手动加上文件类型
        return this.fileType = 'dir';
    } else {
        //如果不是文件夹，就返回正常的文件类型
        return this.fileType = path.extname(filePath);
    }
}
//综合获取文件信息
function FileInfo(filePath) {
    //使用path.basename()的方式获得文件名称
    //其余均是调用了以上方法
    this.fileName = path.basename(filePath);
    this.fileUpdateTime = upDateTime(filePath);
    this.fileSize = Size(filePath);
    this.fileType = Type(filePath);
}